1 Добро пожаловать в мир конструирования ПО 2
1.1. Что такое конструирование ПО 2
1.2. Почему конструирование ПО так важно 5
1.3. Как читать эту книгу 6
2 Метафоры, позволяющие лучше понять разработку ПО 8
2.1. Важность метафор 8
2.2. Как использовать метафоры 10
2.3. Популярные метафоры, характеризующие разработку ПО 12

3 Семь раз отмерь, один раз отрежь: предварительные условия 21
3.1. Важность выполнения предварительных условий 22
3.2. Определите тип ПО, над которым вы работаете 28
3.3. Предварительные условия, связанные с определением проблемы 34
3.4. Предварительные условия, связанные с выработкой требований 36
3.5. Предварительные условия, связанные с разработкой архитектуры 41
3.6. Сколько времени следует посвятить выполнению предварительных условий 52

4 Основные решения, которые приходится принимать при конструировании 58
4.1. Выбор языка программирования 59
4.2. Конвенции программирования 63
4.3. Волны развития технологий 64
4.4. Выбор основных методик конструирования 66

Часть II Высококачественный код

5 Проектирование при конструировании 70
5.1. Проблемы, связанные с проектированием ПО 71
5.2. Основные концепции проектирования 74
5.3. Компоненты проектирования: эвристические принципы 84
5.4. Методики проектирования 107
5.5. Комментарии по поводу популярных методологий 115

6 Классы 121
6.1. Основы классов: абстрактные типы данных 122
6.2. Качественные интерфейсы классов 129
6.3. Вопросы проектирования и реализации 139
6.4. Разумные причины создания классов 148
6.5. Аспекты, специфические для языков 152
6.6. Следующий уровень: пакеты классов 153

7 Высококачественные методы 157
7.1. Разумные причины создания методов 160
7.2. Проектирование на уровне методов 163
7.3. Удачные имена методов 167
7.4. Насколько объемным может быть метод 169
7.5. Советы по использованию параметров методов 170
7.6. Отдельные соображения по использованию функций 177
7.7. Методы-макросы и встраиваемые методы 178

8 Защитное программирование 182
8.1. Защита программы от неправильных входных данных 183
8.2. Утверждения 184
8.3. Способы обработки ошибок 189
8.4. Исключения 193
8.5. Изоляция повреждений, вызванных ошибками 198
8.6. Отладочные средства 200
8.7. Доля защитного программирования в промышленной версии 204
8.8. Защита от защитного программирования 206

9 Процесс программирования с псевдокодом 209
9.1. Этапы создания классов и методов 210
9.2. Псевдокод для профи 211
9.3. Конструирование методов с использованием ППП 214
9.4. Альтернативы ППП 225

Часть III Переменные

10 Общие принципы использования переменных 230
10.1. Что вы знаете о данных? 231
10.2. Грамотное объявление переменных 232
10.3. Принципы инициализации переменных 233
10.4. Область видимости 238
10.5. Персистентность 245
10.6. Время связывания 246
10.7. Связь между типами данных и управляющими структурами 247
10.8. Единственность цели каждой переменной 249

11 Сила имен переменных 252
11.1. Общие принципы выбора имен переменных 253
11.2. Именование конкретных типов данных 257
11.3. Сила конвенций именования 263
11.4. Неформальные конвенции именования 264
11.5. Стандартизованные префиксы 272
11.6. Грамотное сокращение имен переменных 274
11.7. Имена, которых следует избегать 277

12 Основные типы данных 282
12.1. Числа в общем 283
12.2. Целые числа 284
12.3. Числа с плавающей запятой 286
12.4. Символы и строки 289
12.5. Логические переменные 292
12.6. Перечислимые типы 294
12.7. Именованные константы 299
12.8. Массивы 301
12.9. Создание собственных типов данных (псевдонимы) 303

13 Нестандартные типы данных 310
13.1. Структуры 310
13.2. Указатели 314
13.3. Глобальные данные 326

Часть IV Операторы

14 Организация последовательного кода 338
14.1. Операторы, следующие в определенном порядке 338
14.2. Операторы, следующие в произвольном порядке 342
15 Условные операторы 346
15.1. Операторы if 346
15.2. Операторы case 353

16 Циклы 359
16.1. Выбор типа цикла 359
16.2. Управление циклом 365
16.3. Простое создание цикла — изнутри наружу 378
16.4. Соответствие между циклами и массивами 379

17 Нестандартные управляющие структуры 382
17.1. Множественные возвраты из метода 382
17.2. Рекурсия 385
17.3. Оператор goto 389
17.4. Перспективы нестандартных управляющих структур 401

18 Табличные методы 404
18.1. Основные вопросы применения табличных методов 405
18.2. Таблицы с прямым доступом 406
18.3. Таблицы с индексированным доступом 418
18.4. Таблицы со ступенчатым доступом 419
18.5. Другие примеры табличного поиска 422

19 Общие вопросы управления 424
19.1. Логические выражения 424
19.2. Составные операторы (блоки) 436
19.3. Пустые выражения 437
19.4. Укрощение опасно глубокой вложенности 438
19.5. Основа программирования: структурное программирование 448
19.6. Управляющие структуры и сложность 450

Часть V Усовершенствование кода

20 Качество ПО 456
20.1. Характеристики качества ПО 456
20.2. Методики повышения качества ПО 459
20.3. Относительная эффективность
методик контроля качества ПО 462
20.4. Когда выполнять контроль качества ПО 466
20.5. Главный Закон Контроля Качества ПО 467
21 Совместное конструирование 471
21.1. Обзор методик совместной разработки ПО 472
21.2. Парное программирование 475
21.3. Формальные инспекции 477
21.4. Другие методики совместной разработки ПО 484
21.5. Сравнение методик совместного конструирования 487

22 Тестирование, выполняемое разработчиками 490
22.1. Тестирование, выполняемое разработчиками, и качество ПО 492
22.2. Рекомендуемый подход к тестированию, выполняемому разработчиками 494
22.3. Приемы тестирования 496
22.4. Типичные ошибки 507
22.5. Инструменты тестирования 513
22.6. Оптимизация процесса тестирования 518
22.7. Протоколы тестирования 520

23 Отладка 524
23.1. Общие вопросы отладки 524
23.2. Поиск дефекта 529
23.3. Устранение дефекта 539
23.4. Психологические аспекты отладки 543
23.5. Инструменты отладки — очевидные и не очень 545

24 Рефакторинг 551
24.1. Виды эволюции ПО 552
24.2. Введение в рефакторинг 553
24.3. Отдельные виды рефакторинга 559
24.4. Безопасный рефакторинг 566
24.5. Стратегии рефакторинга 568

25 Стратегии оптимизации кода 572
25.1. Общее обсуждение производительности ПО 573
25.2. Введение в оптимизацию кода 576
25.3. Где искать жир и патоку? 583
25.4. Оценка производительности 588
25.5. Итерация 590
25.6. Подход к оптимизации кода: резюме 591

26 Методики оптимизации кода 595
26.1. Логика 596
26.2. Циклы 602
26.3. Изменения типов данных 611
26.4. Выражения 616
26.5. Методы 625
26.6. Переписывание кода на низкоуровневом языке 626
26.7. Если что-то одно изменяется, что#то другое всегда остается постоянным 629

Часть VI Системные вопросы

27 Как размер программы влияет на конструирование 634
27.1. Взаимодействие и размер 635
27.2. Диапазон размеров проектов 636
27.3. Влияние размера проекта на возникновение ошибок 636
27.4. Влияние размера проекта на производительность 638
27.5. Влияние размера проекта на процесс разработки 639

28 Управление конструированием 645
28.1. Поощрение хорошего кодирования 646
28.2. Управление конфигурацией 649
28.3. Оценка графика конструирования 655
28.4. Измерения 661
28.5. Гуманное отношение к программистам 664
28.6. Управление менеджером 670

29 Интеграция 673
29.1. Важность выбора подхода к интеграции 673
29.2. Частота интеграции — поэтапная или инкрементная 675
29.3. Стратегии инкрементной интеграции 678
29.4. Ежедневная сборка и дымовые тесты 686

30 Инструменты программирования 694
30.1. Инструменты для проектирования 695
30.2. Инструменты для работы с исходным кодом 695
30.3. Инструменты для работы с исполняемым кодом 700
30.4. Инструменты и среды 704
30.5. Создание собственного программного инструментария 705
30.6. Волшебная страна инструментальных средств 707

Часть VII Мастерство программирования

31 Форматирование и стиль 712
31.1. Основные принципы форматирования 713
31.2. Способы форматирования 720
31.3. Стили форматирования 721

31.4. Форматирование управляющих структур 728
31.5. Форматирование отдельных операторов 736
31.6. Размещение комментариев 747
31.7. Размещение методов 750
31.8. Форматирование классов 752

32 Самодокументирующийся код 760
32.1. Внешняя документация 760
32.2. Стиль программирования как вид документации 761
32.3. Комментировать или не комментировать 764
32.4. Советы по эффективному комментированию 768
32.5. Методики комментирования 774
32.6. Стандарты IEEE 795

33 Личность 800
33.1. Причем тут характер 801
33.2. Интеллект и скромность 802
33.3. Любопытство 803
33.4. Профессиональная честность 806
33.5. Общение и сотрудничество 809
33.6. Творчество и дисциплина 809
33.7. Лень 810
33.8. Свойства, которые менее важны, чем кажется 811
33.9. Привычки 813

34 Основы мастерства 817
34.1. Боритесь со сложностью 817
34.2. Анализируйте процесс разработки 819
34.3. Пишите программы в первую очередь для людей и лишь во вторую —
для компьютеров 821
34.4. Программируйте с использованием языка, а не на языке 823
34.5. Концентрируйте внимание с помощью соглашений 824
34.6. Программируйте в терминах проблемной области 825
34.7. Опасайтесь падающих камней 827
34.8. Итерируйте, итерируйте и итерируйте 830
34.9. И да отделена будет религия от разработки ПО 831

35 Где искать дополнительную информацию 834
35.1. Информация о конструировании ПО 835
35.2. Не связанные с конструированием темы 836
35.3. Периодические издания 838
35.4. Список литературы для разработчика ПО 839
35.5. Профессиональные ассоциации 841
Библиография 842
Предметный указатель 863
Об авторе 868